package routers

import (
	"bluebell/controller"
	"bluebell/docs"
	"bluebell/logger"
	"bluebell/middlewares"
	"github.com/gin-gonic/gin"
	"github.com/swaggo/files"
	"github.com/swaggo/gin-swagger"
	"net/http"
	"time"
)

// SetupRouter 设置路由
func SetupRouter(mode string) *gin.Engine{
	if mode == gin.ReleaseMode {
		gin.SetMode(gin.ReleaseMode) // 设置成发布模式
	}
	//初始化 gin Engine  新建一个没有任何默认中间件的路由
	r := gin.New()
	r.Use(
		logger.GinLogger(),
		// Recovery 中间件会 recover掉项目可能出现的panic，并使用zap记录相关日志
		logger.GinRecovery(true),
		// 每两秒钟添加十个令牌  全局限流
		middlewares.RateLimitMiddleware(2*time.Second, 40),
	)

	r.LoadHTMLFiles("templates/index.html") // 加载html
	r.Static("/static", "./static")         // 加载静态文件
	r.GET("/", func(context *gin.Context) {
		context.HTML(http.StatusOK, "index.html", nil)
	})

	// 注册swagger
	docs.SwaggerInfo.BasePath = ""
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))

	v1 := r.Group("/api/user")
	{
		// 注册登陆业务
		v1.POST("/signup", controller.SignUpHandler)             // 注册业务
		v1.POST("/login", controller.LoginHandler)               // 登陆业务
		v1.GET("/refresh_token", controller.RefreshTokenHandler) // 刷新accessToken
	}
	v2 := r.Group("/api/post")
	{
		// 帖子业务
		v2.GET("/posts",controller.PostListDetailHandler)	// 分页展示帖子列表
		v2.GET("/post/:post_id", controller.PostDetailHandler) // 查询帖子详情
		v2.GET("/posts2", controller.PostListSortHandler)    // 根据社区id ---> 以创建时间或者分数排序 ---> 分页展示帖子列表
		v2.GET("/search", controller.PostSearchHandler)   // 搜索业务-搜索帖子
	}
	v3 := r.Group("/api/community")
	{
		// 社区业务
		v3.GET("/community", controller.CommunityHandler)           // 获取分类社区列表
		v3.GET("/community/:id", controller.CommunityDetailHandler) // 根据ID查找社区详情
	}
	v4 := r.Group("api/Pantheon").Use(middlewares.JWTAuthMiddleware())// 应用JWT认证中间件
	{
		v4.POST("/post", controller.CreatePostHandler) // 创建帖子
		v4.POST("/vote", controller.VoteHandler) // 投票
		v4.POST("/comment", controller.CommentHandler)    // 评论
		v4.GET("/comments", controller.CommentListHandler) // 评论列表

		//测试
		v4.GET("/ping", func(c *gin.Context) {
			c.String(http.StatusOK, "pong")
		})
	}
	return r
}